﻿using Common;
using Entidades;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Linq;
using Persistence;

namespace Persistencia.Repositorios
{
    public class ProyectoRepositorio
    {
        private readonly ISession _session;

        #region Constructors

        /// <summary>
        /// Constructor por defecto
        /// </summary>
        public ProyectoRepositorio()
        {
            try
            {
                _session = NHibernateSessionHelper.GetSession();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Devuelve los Proyectos FINALIZADOS, PENDIENTES DE PAGO
        /// [Opcional] Id Tipo Usuario
        /// [Opcional] Id Categoría Usuario
        /// [Opcional] Id Tipo Usuario a ignorar
        /// </summary>
        /// <returns></returns>
        public List<Proyecto> ObtenerProyectosPendientesDePago(bool activos = true, int? idTipoUsuario = null, int? idCategoriaUsuario = null, int? idTipoUsuarioIgnorado = null)
        {
            var proyectos = new List<Proyecto>();
            try
            {
                using (var transaction = _session.BeginTransaction())
                {
                    var query = _session.Query<Pago>()
                       .Where
                        (
                            x =>
                            x.Guion.Proyecto.Activo == activos &&
                            x.Guion.Estado.Id       == WellKnownKeys.Entities.EstadosGuion.FINALIZADO.Id &&
                            x.Estado.Id             == WellKnownKeys.Entities.EstadosPago.PENDIENTE_DE_PAGO.Id &&
                            x.Proveedor             != null
                        );

                    if ( idTipoUsuario.HasValue )
                        query = query.Where(x => x.ProveedorRol != null && x.ProveedorRol.Id == idTipoUsuario.Value);

                    if (idTipoUsuarioIgnorado.HasValue)
                        query = query.Where(x => x.ProveedorRol != null && x.ProveedorRol.Id != idTipoUsuarioIgnorado.Value);

                    if ( idCategoriaUsuario.HasValue )
                        query = query.Where(x => x.Proveedor.Categoria != null && x.Proveedor.Categoria.Id == idCategoriaUsuario.Value);

                    proyectos = query
                                .DistinctBy(x => x.Guion.Proyecto.Id)
                                .OrderBy(x => x.Guion.Proyecto.Nombre)
                                .Select(pago => new Proyecto()
                                {
                                    Id              = pago.Guion.Proyecto.Id,
                                    Activo          = pago.Guion.Proyecto.Activo,
                                    Descripcion     = pago.Guion.Proyecto.Descripcion,
                                    FechaCreacion   = pago.Guion.Proyecto.FechaCreacion,
                                    Nombre          = pago.Guion.Proyecto.Nombre,
                                    Tipo            = pago.Guion.Proyecto.Tipo,
                                    UsuarioCreacion = pago.Guion.Proyecto.UsuarioCreacion
                                })
                                .ToList();
                }
            }
            catch (Exception)
            {
                throw;
            }
            return proyectos;
        }

        #endregion
    }
}
